package com.haha.email.util;

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import javax.mail.internet.MimeUtility;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;

/**
 * description: 使用 commons-email 实现邮件发送。<br>
 * 		1. 普通邮件 <br>
 * 		2. 模板邮件 <br>
 * 		3. 带附件的邮件 <br>
 * 
 * @version v1.0
 * @author w
 * @date 2019年7月30日上午11:22:22\
 * @see http://commons.apache.org/proper/commons-email/userguide.html
 **/

public class EmailUtil {
	
	/**
	 * 发件服务器地址 
	 */
	public static final String SMTP_SERVER = "smtp.qq.com";
	/**
	 * 端口
	 */
	public static final String SMTP_SERVER_PORT = "587";
	/**
	 * 帐号
	 */
	public static final String ACCOUNT = "1357204120@qq.com";
	/**
	 * 密码 
	 */
	public static final String PASSWORD = "xmrmektiigdufgcf"; // qq邮箱 需要以授权码为准
	
	/**
	 * description: 获取初始化 Email 对象
	 * @return HtmlEmail
	 * @version v1.0
	 * @author w
	 * @date 2019年7月30日 下午10:07:56
	 */
	private static HtmlEmail getEmail() {
		HtmlEmail htmlEmail = new HtmlEmail();
		// 配置发件信息
		htmlEmail.setSmtpPort(Integer.parseInt(SMTP_SERVER_PORT));
		htmlEmail.setHostName(SMTP_SERVER);
		htmlEmail.setAuthentication(ACCOUNT, PASSWORD);
		htmlEmail.setSSLOnConnect(true);
		htmlEmail.setCharset("UTF-8");
		return htmlEmail;
	}
	
	/**
	 * description:  发送简单的文本邮件
	 * @param addTo 收件人
	 * @param subject 邮件主体
	 * @param msg  邮件内容
	 * @throws EmailException
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年8月7日 下午3:49:57
	 */
	public static void sendSimpleEmail(String addTo , String subject , String msg) throws EmailException {
		HtmlEmail htmlEmail = getEmail();
		htmlEmail.setFrom(ACCOUNT);
		htmlEmail.addTo(addTo);
		htmlEmail.setSubject(subject);
		htmlEmail.setHtmlMsg(msg);
		htmlEmail.send();
	}
	
	/**
	 * description: 发送简单的文本邮件
	 * @throws EmailException
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年7月30日 下午10:08:57
	 */
	public static void sendSimpleEmail() throws EmailException {
		HtmlEmail htmlEmail = getEmail();
		htmlEmail.setFrom(ACCOUNT);
		htmlEmail.addTo("2268236190@qq.com");
		htmlEmail.setSubject("java 邮件测试 ");
		htmlEmail.setHtmlMsg("邮箱内容 。。。");
		htmlEmail.send();
	}
	
	/**
	 * description: 发送附件邮件 
	 * @param path  附件路径，也可以是url
	 * @param attachmentName 附件名称
	 * @param addTo  收件人
	 * @param subject  主题
	 * @param msg 内容
	 * @throws Exception
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年8月7日 下午4:06:28
	 */
	public static void sendAttachmentEmail(String path ,String attachmentName,String addTo , String subject , String msg) throws Exception {
		EmailAttachment attachment = new EmailAttachment();
	  	// 也可以发送本地文件作为附件
		//  attachment.setPath(path);
		attachment.setURL(new URL(path));
		attachment.setDisposition(EmailAttachment.ATTACHMENT);
		attachment.setDescription("图片描述zzz");
		// 附件名称
		attachment.setName(attachmentName);
		  
		HtmlEmail htmlEmail = getEmail();
		// 添加附件
		htmlEmail.attach(attachment);
		  
		htmlEmail.setFrom(ACCOUNT);
		htmlEmail.addTo(addTo);
		htmlEmail.setSubject(subject);
		htmlEmail.setHtmlMsg(msg);
		htmlEmail.send();
	}
	
	/**
	 * description: 发送含有附件的邮件
	 * @throws EmailException
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年7月30日 下午10:34:54
	 */
	public static void sendAttachmentEmail() throws Exception {
		// Create the attachment
		EmailAttachment attachment = new EmailAttachment();
	  	// 也可以发送本地文件作为附件
		//  attachment.setPath("C:/demo.jpg");
		attachment.setURL(new URL("http://b-ssl.duitang.com/uploads/item/201705/28/20170528153402_ZYNBh.jpeg"));
		attachment.setDisposition(EmailAttachment.ATTACHMENT);
		attachment.setDescription("图片描述zzz");
		// 附件名称
			// MimeUtility 解决中文乱码
		attachment.setName(MimeUtility.encodeText("John.png")); 
		  
		HtmlEmail htmlEmail = getEmail();
		// 添加附件
		htmlEmail.attach(attachment);
		  
		htmlEmail.setFrom(ACCOUNT);
		htmlEmail.addTo("2268236190@qq.com");
		htmlEmail.setSubject("java 附件邮件");
		htmlEmail.setHtmlMsg("附件如下");
		htmlEmail.send();
	}
	
	/**
	 * description: 发送模板邮件 
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年7月30日 下午10:11:38
	 */
	public static void sendTemplateEmail() throws Exception {
		HtmlEmail htmlEmail = getEmail();
		String templateName = "demo.html" ; 
		String path = EmailUtil.class.getResource("/").getFile();
		Map<String,Object> map = new HashMap<>();
		map.put("authCode", 110120);
		String htmlStr = FreeMarkerUtil.convertToString(path, templateName, map);
		htmlEmail.setFrom(ACCOUNT);
		htmlEmail.addTo("2268236190@qq.com");
		htmlEmail.setSubject("java 模板邮件");
		htmlEmail.setHtmlMsg(htmlStr);
		htmlEmail.send();
	}
	
	/**
	 * description: 发送模板邮件
	 * @param templateName  模板名称
	 * @param addTo  收件人
	 * @param subject  邮件主题
	 * @param map  邮件数据
	 * @throws Exception
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2019年8月7日 下午3:42:37
	 */
	public static void sendTemplateEmail(String templateName , String addTo ,String subject,Map<String,Object> map) throws Exception {
		HtmlEmail htmlEmail = getEmail();
		// 模板根目录 
		String path = EmailUtil.class.getResource("/").getFile();
		// 生成的模板转换成字符串输出 
		String htmlStr = FreeMarkerUtil.convertToString(path, templateName, map);
		// 发件人
		htmlEmail.setFrom(ACCOUNT);
		// 收件人， 可多个
		htmlEmail.addTo(addTo);
		// 邮件主题
		htmlEmail.setSubject(subject);
		// 邮件内容 
		htmlEmail.setHtmlMsg(htmlStr);
		// 发送
		htmlEmail.send();
	}
	
	public static void main(String[] args) {
		try {
			// sendSimpleEmail();
		//	sendTemplateEmail();
			sendAttachmentEmail();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
